/**
 * Copyright (c) Huawei Technologies Co., Ltd. 1987-2021. All rights reserved.
*/

package com.gitee.fufu669.config.redis;

import java.util.ArrayList;
import java.util.List;

import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import org.springframework.util.StringUtils;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;

//懒加载
@Lazy
// 注解
@SuppressWarnings({ "rawtypes", "unused" })
// 配置注解
@Configuration
/** @author wangfupeng */
/**
 * TODO
*/
public class ShardedJedisPoolConfig {

    // 日志对象
    private static final Logger logger = LoggerFactory.getLogger(ShardedJedisPoolConfig.class);

    /**
     * TODO
    */
    public static final String ONLINE = "online";

    // 依赖注入值的注解
    @Value("${redis.maxWaitMillis:0}")
    // TODO
    private Long maxWaitMillis;
    // 依赖注入值的注解
    @Value("${redis.testOnBorrow:false}")
    // TODO
    private Boolean testOnBorrow;
    // 依赖注入值的注解
    @Value("${redis.testOnReturn:false}")
    // TODO
    private Boolean testOnReturn;
    // 依赖注入值的注解
    @Value("${redis.maxIdle:1}")
    // TODO
    private Integer maxIdle;
    // 依赖注入值的注解
    @Value("${redis.maxTotal:1}")
    // TODO
    private Integer maxTotal;
    // 依赖注入值的注解
    @Value("${redis.minIdle:1}")
    // TODO
    private Integer minIdle;
    // 依赖注入值的注解
    @Value("${redis.lifo:false}")
    // TODO
    private Boolean lifo;
    // 依赖注入值的注解
    @Value("${redis.hostAndPorts:}")
    // TODO
    private String hostAndPorts;
    // 依赖注入值的注解
    @Value("${redis.password:}")
    // TODO
    private String password;

    // 把对象构造出来注入容器的注解
    @Bean(name = "jedisPoolConfigCacheFetchLater")
    /**
     * TODO
    */
    public redis.clients.jedis.JedisPoolConfig jedisPoolConfig() {
        // 创建
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 判断
        if(StringUtils.isEmpty(hostAndPorts)){
            // 返回
            return jedisPoolConfig;
        }
        // TODO
        jedisPoolConfig.setMaxIdle(maxIdle);
        // TODO
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // TODO
        jedisPoolConfig.setTestOnBorrow(testOnBorrow);
        // TODO
        jedisPoolConfig.setMaxTotal(maxTotal);
        // TODO
        jedisPoolConfig.setMinIdle(minIdle);
        // TODO
        jedisPoolConfig.setLifo(lifo);
        // 返回
        return jedisPoolConfig;
    }

    // 把对象构造出来注入容器的注解
    @Bean(name = "shardedJedisPoolCacheFetchLater")
    /**
     * TODO
    */
    public redis.clients.jedis.ShardedJedisPool shardedJedisPool(@Qualifier("jedisPoolConfigCacheFetchLater") JedisPoolConfig jedisPoolConfig) {
        // 创建
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
        // 切分
        String[] hostAndPortsArray = hostAndPorts.split(", ");
        // 拿列表
        Lists.newArrayList(hostAndPortsArray).forEach(host -> {
            // 切分
            String[] hostArray = host.split(":");
            // 赋值
            String hostAddress = hostArray[0];
            // 赋值
            Integer port = null;
            // 尝试下面的代码
            try {
                // 转换值
                port = Integer.valueOf(hostArray[1]);
            // 捕捉异常
            } catch (Exception e) {
                // 赋值
                port = 0;
            }
            // 创建
            JedisShardInfo info = new JedisShardInfo(hostAddress, port);
            // 判断
            if(!StringUtils.isEmpty(password)) {
                // TODO
                info.setPassword(password);
            // 否则
            }else{
                // TODO
                info.setPassword(null);
            }
            // 增加
            shards.add(info);
        });
        // 创建
        ShardedJedisPool shardedJedisPool = new ShardedJedisPool(jedisPoolConfig, shards);
        // 返回
        return shardedJedisPool;
    }
    
    // 把对象构造出来注入容器的注解
    @Bean(name = "keySerializer")
    /**
     * TODO
    */
    public RedisSerializer keySerializer() {
        // 返回
        return  new StringRedisSerializer();
    }

    // 把对象构造出来注入容器的注解
    @Bean(name = "valueSerializer")
    /**
     * TODO
    */
    public RedisSerializer valueSerializer() {
        // 返回
        return new CustomGenericJackson2JsonRedisSerializer();
    }

}

